package com.atguigu.pool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolDemo1 {
    public static void main(String[] args) {
        ThreadPoolExecutor tPool = new ThreadPoolExecutor(
                Runtime.getRuntime().availableProcessors(),     //本机电脑硬件核数的方法(8核,12核 这种)
                Runtime.getRuntime().availableProcessors() +1 ,     //最大线程 ,加一或是翻倍
                1l, //多余线程存活时间
                TimeUnit.SECONDS,   //存活时间的单位/秒
                new ArrayBlockingQueue<>(3),    //阻塞队列, 等待区大小
                Executors.defaultThreadFactory(),   //工厂,一般默认
                new ThreadPoolExecutor.DiscardOldestPolicy()    //拒绝策略, 共四种

                /**
                 * 1. AbortPolicy（默认策略）
                 * 直接抛出`RejectedExecutionException`异常，中断任务提交流程。
                 * 2.CallerRunsPolicy
                 * 由提交任务的调用者线程（如主线程）直接执行被拒绝的任务。
                 * 3.DiscardPolicy
                 * 静默丢弃被拒绝的任务，不抛出异常也不执行任务。
                 * 4.DiscardOldestPolicy
                 * 丢弃工作队列中最旧的任务（队列头部任务），并尝试重新提交当前被拒绝的任务
                 */
        );


        try {
            for (int i = 1; i <= 10; i++) {
                int finalI = i;
                tPool.execute(()->{     //runnable 借口
                    System.out.println(Thread.currentThread().getName() +"  i =  " + finalI);
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            tPool.shutdown();
        }
    }
}
